

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * 弥补JDK线程池
 * 限制 activeThreadNum 个活跃线程运行，新来的进行阻塞
 * Created by hxy on 2018/1/25.
 */
public class CountableThreadPool {
    private Semaphore semaphore;

    private ExecutorService executorService;

    public CountableThreadPool(int activeThreadNum, ExecutorService executorService) {
        this.executorService = executorService;
        this.semaphore = new Semaphore(activeThreadNum);
    }

    public CountableThreadPool(int activeThreadNum) {
        executorService = Executors.newFixedThreadPool(activeThreadNum);
        this.semaphore = new Semaphore(activeThreadNum);
    }

    public void run(Runnable runnable) {
        try {
            semaphore.acquire();
            executorService.execute(() -> {
                try {
                    runnable.run();
                } finally {
                    semaphore.release();
                }
            });
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
